Visual Studioでデバッグ中に戻る前に戻り値を見つけることはできますか?
-
06-07-2019 - |
質問
次の機能を実行します。
DataTable go() {
return someTableAdapter.getSomeData();
}
この関数にブレークポイントを設定すると、戻り値を検査する可能性がありますか? go()
は、 .aspx
ページのデータグリッドに直接結合されています。
返されたデータテーブルを検査する唯一の方法は、一時変数を使用することです。しかし、それは少し不便です。別の方法はありませんか?
解決
知らない。変数を追加する 場合は、とにかくリリースビルドのコンパイラによって削除されることに注意してください...
更新:
この機能が追加されましたVS2013 。
autosウィンドウで戻り値を確認するか、watch / immediateウィンドウで $ ReturnValue
を使用できます。
値は関数から戻った直後にのみ表示されるため、関数呼び出しにブレークポイントを設定して呼び出しをステップオーバー(F10)することでアクセスするのが最も簡単な方法です。
VS2015の更新:ブー!残念ながら、VS2015(devenv v14)にはないようです
VS2017の更新:戻ってきました。 (devenv v15)
他のヒント
これは、CLR 4.5.1を使用してVisual Studio 2013で実行できますカスタマーフィードバックサイトによると。 C#の以前のバージョンでは使用できませんでした。
(Visual  Studio  2008以前ではVB.NETでサポートされていました。C/ C ++開発者は常に利用できました。)
Microsoftによると、マネージコードでこれを確実に実装する方法はありません。これは、彼らが認識し、取り組んでいる問題です:
ネイティブC ++またはVB6コードのデバッグの経験がある人のために、Autosウィンドウで関数の戻り値が提供される機能を使用した可能性があります。残念ながら、この機能はマネージコードには存在しません。戻り値をローカル変数に割り当てることでこの問題を回避できますが、コードを変更する必要があるため、それほど便利ではありません。 マネージコードでは、ステップオーバーした関数の戻り値を判断するのは非常に面倒です。ここでは一貫して正しいことを行うことができないことに気づいたため、デバッガーに誤った結果を表示するのではなく、機能を削除しました。ただし、これをお客様に提供したいと考えており、CLRとデバッガーのチームはこの問題に対する多くの潜在的な解決策を検討しています。残念ながら、これはVisual Studio 11の一部ではありません。
Marc Gravellが現在受け入れている回答によると:
この機能がVisual  Studio  2013 に追加されました。あなたはリターンを見ることができます autosウィンドウの値、またはwatch / immediateで$ ReturnValueを使用 ウィンドウ
この回答は、Visual  Studio  2015ではこの機能が動作しないことも述べています。これは(完全に)真実ではありません。 メソッド呼び出しの戻り値を調べる 次の注意事項があります。
$ ReturnValue が認識されるためには、レガシー式エバリュエーターをオンにする必要があります(ツール/オプション/デバッグ/レガシーC#およびVB式エバリュエーターを使用)。それ以外の場合は、 $ ReturnValue1 を使用できます。
Visual  Studio  2015 Enterpriseでこれをテストしました:
- 従来の式エバリュエーターがオフの場合:のみ $ ReturnValue1 は機能します
- レガシー式エバリュエーターを有効にした場合:両方 $ ReturnValue および $ ReturnValue1 が動作する
メニューに移動すると、ツール→ オプション、IntelliTrace、設定を変更してイベントと通話情報を収集します。
前の呼び出しイベント( Ctrl + Shift + F11 )に戻り、メソッド呼び出しから返された一時的な値を確認できますautosウィンドウでメソッド名の子として。
これは、現在のメソッドの戻り値を表示するのではなく、現在のメソッドで呼び出された最後のメソッドの戻り値を表示するだけです。
だから、それは大丈夫です
DataTable go(){return someTableAdapter.getSomeData();}
someTableAdapter.getSomeData()
の戻り値を示しているため。
ただし、対象外:
int go(){return 100 * 99;}
.NET時代以前の古いトリック:[レジスタ]ウィンドウを開き、EAXレジスタの値を確認します。これには、最後に呼び出された関数の戻り値が含まれます。
Shift-F11を使用してgo()メソッドからステップアウトし、次に「Autos」デバッグウィンドウには、スタックからポップしたメソッド呼び出しの戻り値が表示されます(この場合は、必要なgo()メソッド)。これはVisual Studio 2005の動作です。私はVisual Studio 2008を使用したことがないので、そのバージョンでこれが同じように動作するかどうかはわかりません。
はい、非常に良い方法があります。重大な欠点の1つは、5年、おそらく6年待たなければならないことです。 2008年11月に投稿したことがわかりましたので、waaaaaa ...
をお勧めします。... aaaait。そしてボイル&#224 ;!ちょうどあなたのために、MSは最新の Visual Studio 2013 をリリースしました。これは、デバッグモード(メニューデバッグ → Windows → 自動車)。
多くの回避策がありますが、満足できるものはありません。
下記のジョン・スキートを引用するには(削除された回答についてコメントしてください):
それでも私には不便に見える- 特に、どれがわからない場合 必要な戻り値 デバッグを開始する前に。本当に 一時的にする必要はありません 毎回コードを乱雑にする変数 何かを返すとき。t
理論的には、デバッガーは return
変数を持つことができます。結局のところ、それは単にスタック上の変数です:
unsafe {
int * sp = stackalloc int[1];
try {
return a+b;
}
finally {
Trace.WriteLine("return is " + *(sp+3));
}
}
したがって、これはVisual Studioの機能リクエストと考えてください。
以前はMicrosoft Visual C ++がこれを行っていましたが、Visual Studioは知らない..:(
私が知っている唯一の方法は、リターン行にブレークポイントを配置してから、クイックウォッチウィンドウを呼び出し、返された式を入力することです。
someTableAdapter.getSomeData();
ただし、これは、呼び出しがオブジェクトの状態を変更しない場合にのみ機能します(実行を再開するときに同じメソッドへの2番目の呼び出しがあるため)。
これをVisual  Studio  2015で機能させるためのPascalKの回答。 メソッド呼び出しの戻り値を調べる 。
関数呼び出しをネストしている場合、疑似変数 $ ResultValueX
が自動的に作成されます。Xは関数呼び出しの順序を指します。したがって、 Multiply(Five()、Six())
などの呼び出しがある場合、次の擬似変数が作成されます。
Five() | $ResultValue1 = 5
Six() | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30
フラグや他の変数を設定せず、何かを返すだけの場合、中間ウィンドウの値を評価するように依頼することもできます。
[レジスタ]ウィンドウ(デバッグ/ウィンドウ/レジスタ)でRAXレジスタを確認することで、これを判断できると思います。関数をステップアウト(SHIFT + F11)した後、RAXレジスタを確認します。事実はわかりませんが、月が来ると、レジスターを(.NET日前に)チェックして戻り値を見ることができます。 RAXとRBXなどの組み合わせである場合もあります。
デバッグを開く→自動車のウィンドウはあなたを閉じます。実際の戻り値は表示されませんが、returnステートメントで評価されたものは表示されます。
ええ、VB.NETに切り替えて。 ; P(「Visual Studio」と言っただけです。;)
覚えている限り(Visual BasicからVB.NETのすべてのバージョンまで)、関数名を単純に照会できます。 「機能」関数の開始時に暗黙的に宣言されたローカル変数のように、関数が非戻りステートメント手段を介して終了するとき(つまり、 Exit Function
または単に通り抜けるとき)に、その現在値も戻り値として使用されますそしてもちろん、returnステートメントが使用されるとき。
これは、returnステートメントの式にも設定されます。ローカル変数と同様に、その値は、関数内の実行の任意のポイント(returnステートメントの実行後を含む)で検査できます。 C#にはこれがないため、必要です。
この小さなVB.NET機能(および有効にする Exit Function
ステートメント-C#にはない別の機能)は、ディフェンシブプログラミング最初のステートメントとして、常に関数名を失敗/デフォルト値に初期化する練習をしています。次に、任意の障害ポイント(通常は成功ポイントよりも頻繁に発生します)で、 Exit Function
ステートメントを呼び出すことができます(つまり、障害/デフォルト式、または定数/変数を複製する必要はありません)名前)。
受け入れられた回答はVisual  Studio  2015では正しく動作しませんが、メソッドの最後の行にブレークポイントを置き、 F10 を押すと、ローカルウィンドウへの戻り値の式。
" someTableAdapter.getSomeData();"
を選択して右クリックし、クイックウォッチに移動してみてください。
リターン式をウォッチウィンドウにドラッグアンドドロップします。
たとえば、次のステートメント
return someTableAdapter.getSomeData();
ドラッグアンドドロップ
someTableAdapter.getSomeData()
ウォッチウィンドウに移動すると、値が表示されます。
任意の式に対してこれを行うことができます。